<!DOCTYPE html>
<meta charset="utf-8">
<title>CSS Animations Test: animation-delay - negative value</title>
<link rel="author" title="Nokia Inc." href="http://www.nokia.com">
<link rel="author" title="Intel" href="http://www.intel.com">
<link rel="reviewer" title="Zhiqiang Zhang" href="mailto:zhiqiang.zhang@intel.com"> <!-- 2015-03-18 -->
<link rel="help" href="https://drafts.csswg.org/css-animations-1/#animation-delay">
<link rel="help" href="https://drafts.csswg.org/css-animations-1/#animation-name">
<link rel="help" href="https://drafts.csswg.org/css-animations-1/#animation-duration">
<link rel="help" href="https://drafts.csswg.org/css-animations-1/#animation-timing-function">
<meta name="flags" content="animated">
<meta name="assert" content="When animation-delay is set to a negative time offset,
                             animation will execute as soon as it is applied
                             but act as if the animation had started the specified
                             time in the past.">
<style>
  div {
    animation-timing-function: linear;

    height: 100px;
    width: 100px;
    position: relative;
  }

  #test-negative-delay {
    animation-name: test-negative-delay;
    animation-duration: 6s;
    animation-delay: -3s;
    background-color: blue;
  }

  #ref-no-delay {
    animation-name: ref-no-delay;
    animation-duration: 3s;
    background-color: yellow;
  }

  @keyframes test-negative-delay {
    from {
      left: 150px;
    }
    to {
      left: 0px;
    }
  }

  @keyframes ref-no-delay {
    from {
      left: 75px;
    }
    to {
      left: 0px;
    }
  }
</style>
<body>
  <p>
    Test passes if there are a filled blue square with 'Filler Text'
    and a filled yellow square with 'Filler Text', and if the two squares
    start moving together from right to left as soon as the page loads.
  </p>
  <div id="test-negative-delay">Filler Text</div>
  <div id="ref-no-delay">Filler Text</div>
</body>
<script>
  await sleep(0.2);
  const negativeDelay = document.getElementById('test-negative-delay');
  const ref = document.getElementById('ref-no-delay');
  expect(Math.round(negativeDelay.offsetLeft) - Math.round(ref.offsetLeft) < 5).toBe(true, 'negative should equal to ref');
  expect(negativeDelay.offsetLeft < 80 && negativeDelay.offsetLeft > 60).toBe(true, `negativeDelay offsetLeft: ${negativeDelay.offsetLeft}`);
  await sleep(1);
  expect(Math.round(negativeDelay.offsetLeft)).toBe(Math.round(ref.offsetLeft), 'negativeDelay should be equal to ref');
  expect(negativeDelay.offsetLeft < 60 && negativeDelay.offsetLeft > 20).toBe(true,  `negativeDelay offsetLeft: ${negativeDelay.offsetLeft}`);
  await sleep(3);
  expect(Math.round(negativeDelay.offsetLeft)).toBe(Math.round(ref.offsetLeft), 'negative delay should be at the end');
  expect(negativeDelay.offsetLeft === 0).toBe(true);

  const style = window.getComputedStyle(negativeDelay);
  expect(style['animationDelay']).toBe('-3s');
  expect(style['animation-delay']).toBe('-3s');
  expect(style['animationDuration']).toBe('6s');
  expect(style['animation-duration']).toBe('6s');
  expect(style['animationName']).toBe('test-negative-delay');
  expect(style['animation-name']).toBe('test-negative-delay');
  expect(style['animationFillMode']).toBe('none');
  expect(style['animation-fill-mode']).toBe('none');
  expect(style['animationTimingFunction']).toBe('linear');
  expect(style['animation-timing-function']).toBe('linear');
</script>
